package com.snimay.xxy;

import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.Base64.Encoder;

import javax.crypto.Cipher;

public class RSA {
    private static String src="security with rsa";
    
    public static void main(String[] args){
        jdkRSA();
    }

    public static void jdkRSA(){
        try {
        	
        	Encoder endcoder = Base64.getEncoder();
            //初始化密钥
            KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA");
            keyPairGenerator.initialize(512);//64的整倍数，512~65536
            KeyPair keyPair=keyPairGenerator.generateKeyPair();
            RSAPrivateKey rsaPrivateKey= (RSAPrivateKey) keyPair.getPrivate();
            RSAPublicKey rsaPublicKey= (RSAPublicKey) keyPair.getPublic();
            
            System.out.println("Public key:"+ endcoder.encodeToString(rsaPrivateKey.getEncoded()));
            System.out.println("Priv   key:"+ endcoder.encodeToString(rsaPublicKey.getEncoded()));
     
            
 
            //私钥加密，公钥解密——加密
            PKCS8EncodedKeySpec pkcs8EncodedKeySpec=new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
            KeyFactory keyFactory=KeyFactory.getInstance("RSA");
            PrivateKey privateKey=keyFactory.generatePrivate(pkcs8EncodedKeySpec);
            Cipher cipher=Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, privateKey);
            byte[] result=cipher.doFinal(src.getBytes());
            System.out.println("私钥加密，公钥解密——加密:"+endcoder.encodeToString(result));

            //私钥加密，公钥解密——解密
            X509EncodedKeySpec x509EncodedKeySpec=new X509EncodedKeySpec(rsaPublicKey.getEncoded());
            keyFactory=KeyFactory.getInstance("RSA");
            PublicKey publicKey=keyFactory.generatePublic(x509EncodedKeySpec);
            cipher=Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE,publicKey);
            result=cipher.doFinal(result);
            System.out.println(new String(result));

            /*//公钥加密，私钥解密——加密
            x509EncodedKeySpec=new X509EncodedKeySpec(rsaPublicKey.getEncoded());
            keyFactory=KeyFactory.getInstance("RSA");
            publicKey=keyFactory.generatePublic(x509EncodedKeySpec);
            cipher=Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE,publicKey);
            result=cipher.doFinal(src.getBytes());
            System.out.println("钥加密，私钥解密——加密:"+Base64.encodeToString(result,1));

            //公钥加密，私钥解密——解密
            pkcs8EncodedKeySpec=new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
            keyFactory=KeyFactory.getInstance("RSA");
            privateKey=keyFactory.generatePrivate(pkcs8EncodedKeySpec);
            cipher=Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE,privateKey);
            cipher.doFinal(result);
            System.out.println("公钥加密，私钥解密——解密:" + Base64.encodeToString(result, 1));*/

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}